home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dr. Windows 3
/
dr win3.zip
/
dr win3
/
PROGRAMR
/
OLE2BOOK.ZIP
/
CHAP11.ZIP
/
CHAP11
/
POLYLINE
/
POLYLINE.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1993-06-22
|
17KB
|
736 lines
/*
* POLYLINE.CPP
* Polyline Component Object Chapter 11
*
* Implementation of the CPolyline class that we expose as an
* OLE 2.0 component object.
*
* Copyright (c)1993 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Software Design Engineer
* Microsoft Systems Developer Relations
*
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/
#include "polyline.h"
/*
* CPolyline:CPolyline
* CPolyline::~CPolyline
*
* Constructor Parameters:
* punkOuter LPUNKNOWN of the controlling unknown.
* pfnDestroy LPFNDESTROYED to call when an object is destroyed.
* hInst HINSTANCE of the application we're in.
*/
CPolyline::CPolyline(LPUNKNOWN punkOuter, LPFNDESTROYED pfnDestroy
, HINSTANCE hInst)
{
m_hWnd=NULL;
m_hInst=hInst;
m_cRef=0;
m_punkOuter=punkOuter;
m_pfnDestroy=pfnDestroy;
m_fDirty=FALSE;
m_pST=NULL;
m_cf =0;
m_clsID=CLSID_Polyline11;
m_iID =IID_IPolyline6;
//NULL any contained interfaces initially.
m_pIPolyline =NULL;
m_pIPersistStorage =NULL;
m_pIDataObject =NULL;
m_pIDataAdviseHolder=NULL;
m_pAdv =NULL;
//Initialize IDataObject::EnumFormatEtc arrays
m_cf=RegisterClipboardFormat(SZPOLYLINECLIPFORMAT);
//CHAPTER11MOD
m_pDefIUnknown =NULL;
m_pDefIOleObject =NULL;
m_pDefIDataObject =NULL;
m_pDefIViewObject =NULL;
m_pDefIPersistStorage=NULL;
m_pIOleAdviseHolder =NULL;
m_pIOleObject =NULL;
m_pIOleClientSite =NULL;
m_pIViewObject =NULL;
m_pIAdviseSink =NULL;
m_dwFrozenAspects =0;
m_dwAdviseAspects =0;
m_dwAdviseFlags =0;
m_hDlg=NULL;
//End CHAPTER11MOD
return;
}
CPolyline::~CPolyline(void)
{
if (NULL!=m_pST)
delete m_pST;
//CHAPTER11MOD
if (NULL!=m_hDlg)
DestroyWindow(m_hDlg);
if (NULL!=m_pDefIUnknown)
m_pDefIUnknown->Release();
if (NULL!=m_pDefIOleObject)
m_pDefIOleObject->Release();
if (NULL!=m_pDefIViewObject)
m_pDefIViewObject->Release();
if (NULL!=m_pDefIDataObject)
m_pDefIDataObject->Release();
if (NULL!=m_pDefIPersistStorage)
m_pDefIPersistStorage->Release();
if (NULL!=m_pIAdviseSink)
m_pIAdviseSink->Release();
if (NULL!=m_pIViewObject)
delete m_pIViewObject;
if (NULL!=m_pIOleClientSite)
m_pIOleClientSite->Release();
if (NULL!=m_pIOleAdviseHolder)
m_pIOleAdviseHolder->Release();
if (NULL!=m_pIOleObject)
delete m_pIOleObject;
//End CHAPTER11MOD
//Free our contained interfaces, delete those we own, Release others.
if (NULL!=m_pIDataAdviseHolder)
m_pIDataAdviseHolder->Release();
if (NULL!=m_pIDataObject)
delete m_pIDataObject;
if (NULL!=m_pIPersistStorage)
delete m_pIPersistStorage;
if (NULL!=m_pIPolyline)
delete m_pIPolyline;
//Reverses the AddRef in ::SetAdvise
if (NULL!=m_pAdv)
m_pAdv->Release();
return;
}
/*
* CPolyline::FInit
*
* Purpose:
* Performs any intiailization of a CPolyline that's prone to failure
* that we also use internally before exposing the object outside
* this DLL.
*
* Parameters:
* None
*
* Return Value:
* BOOL TRUE if the function is successful, FALSE otherwise.
*/
BOOL CPolyline::FInit(void)
{
LPUNKNOWN pIUnknown=(LPUNKNOWN)this;
HRESULT hr;
if (NULL!=m_punkOuter)
pIUnknown=m_punkOuter;
m_pST=new CStringTable(m_hInst);
if (!m_pST->FInit(IDS_POLYLINEMIN, IDS_POLYLINEMAX))
return FALSE;
//Allocate contained interfaces.
m_pIPolyline=new CImpIPolyline(this, pIUnknown);
if (NULL==m_pIPolyline)
return FALSE;
m_pIPersistStorage=new CImpIPersistStorage(this, pIUnknown);
if (NULL==m_pIPersistStorage)
return FALSE;
m_pIDataObject=new CImpIDataObject(this, pIUnknown);
if (NULL==m_pIDataObject)
return FALSE;
//CHAPTER11MOD
m_pIOleObject=new CImpIOleObject(this, pIUnknown);
if (NULL==m_pIOleObject)
return FALSE;
m_pIViewObject=new CImpIViewObject(this, pIUnknown);
if (NULL==m_pIViewObject)
return FALSE;
//Get stuff from the default handler so we get some free implementation
hr=OleCreateDefaultHandler(CLSID_Polyline11, pIUnknown, IID_IUnknown
, (LPLPVOID)&m_pDefIUnknown);
if (FAILED(hr))
return FALSE;
//Now try to get other interfaces to which we delegate
hr=m_pDefIUnknown->QueryInterface(IID_IOleObject
, (LPLPVOID)&m_pDefIOleObject);
if (FAILED(hr))
return FALSE;
hr=m_pDefIUnknown->QueryInterface(IID_IViewObject
, (LPLPVOID)&m_pDefIViewObject);
if (FAILED(hr))
return FALSE;
hr=m_pDefIUnknown->QueryInterface(IID_IDataObject
, (LPLPVOID)&m_pDefIDataObject);
if (FAILED(hr))
return FALSE;
hr=m_pDefIUnknown->QueryInterface(IID_IPersistStorage
, (LPLPVOID)&m_pDefIPersistStorage);
if (FAILED(hr))
return FALSE;
m_pIPolyline->New();
//End CHAPTER11MOD
return TRUE;
}
/*
* CPolyline::QueryInterface
* CPolyline::AddRef
* CPolyline::Release
*
* Purpose:
* IUnknown members for CPolyline object.
*/
STDMETHODIMP CPolyline::QueryInterface(REFIID riid, LPVOID FAR *ppv)
{
*ppv=NULL;
/*
* The only calls we get here for IUnknown are either in a non-aggregated
* case or when we're created in an aggregation, so in either we always
* return our IUnknown for IID_IUnknown.
*/
if (IsEqualIID(riid, IID_IUnknown))
*ppv=(LPVOID)this;
//For anything else we return contained interfaces.
if (IsEqualIID(riid, m_iID))
*ppv=(LPVOID)m_pIPolyline;
if (IsEqualIID(riid, IID_IPersist) || IsEqualIID(riid, IID_IPersistStorage))
*ppv=(LPVOID)m_pIPersistStorage;
if (IsEqualIID(riid, IID_IDataObject))
*ppv=(LPVOID)m_pIDataObject;
//CHAPTER11MOD
if (IsEqualIID(riid, IID_IOleObject))
*ppv=(LPVOID)m_pIOleObject;
if (IsEqualIID(riid, IID_IViewObject))
*ppv=(LPVOID)m_pIViewObject;
//Use the default handler's cache.
if (IsEqualIID(riid, IID_IOleCache))
return m_pDefIUnknown->QueryInterface(riid, ppv);
//End CHAPTER11MOD
//AddRef any interface we'll return.
if (NULL!=*ppv)
{
((LPUNKNOWN)*ppv)->AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CPolyline::AddRef(void)
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CPolyline::Release(void)
{
ULONG cRefT;
cRefT=--m_cRef;
if (0==m_cRef)
delete this;
return cRefT;
}
/*
* CPolyline::RectConvertMappings
*
* Purpose:
* Converts the contents of a rectangle from device (MM_TEXT) or
* HIMETRIC to the other.
*
* Parameters:
* pRect LPRECT containing the rectangle to convert.
* fToDevice BOOL TRUE to convert from HIMETRIC to device,
* FALSE to convert device to HIMETRIC.
*
* Return Value:
* None
*/
void CPolyline::RectConvertMappings(LPRECT pRect, BOOL fToDevice)
{
HDC hDC;
int iLpx, iLpy;
if (NULL==pRect)
return;
hDC=GetDC(NULL);
iLpx=GetDeviceCaps(hDC, LOGPIXELSX);
iLpy=GetDeviceCaps(hDC, LOGPIXELSY);
ReleaseDC(NULL, hDC);
if (fToDevice)
{
pRect->left=MulDiv(iLpx, pRect->left, HIMETRIC_PER_INCH);
pRect->top =MulDiv(iLpy, pRect->top , HIMETRIC_PER_INCH);
pRect->right =MulDiv(iLpx, pRect->right, HIMETRIC_PER_INCH);
pRect->bottom=MulDiv(